package io.wongxd.solution.util

import android.app.Activity
import android.app.ActivityManager
import android.content.Context
import android.content.ContextWrapper
import android.content.Intent
import android.net.Uri
import android.os.Build
import android.os.PowerManager
import android.provider.Settings
import androidx.annotation.RequiresApi


/**
 *
 * <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
 *
在后台中运行的 Service 会消耗设备资源，这可能会降低用户体验。 为了缓解这一问题，系统对这些 Service 施加了一些限制。

如果满足以下任意条件，应用将被视为处于前台：

具有可见 Activity（不管该 Activity 已启动还是已暂停）。
具有前台 Service。
另一个前台应用已关联到该应用（不管是通过绑定到其中一个 Service，还是通过使用其中一个内容提供程序）。 例如，如果另一个应用绑定到该应用的 Service，那么该应用处于前台：
IME（输入法）
壁纸 Service
通知侦听器
语音或文本 Service
如果以上条件均不满足，应用将被视为处于后台。

 *
 * 忽略电池优化
 *
 * @constructor Create empty Ignoring battery optimizations
 */
object IgnoringBatteryOptimizations {

    /**
     *
     * 申请忽略电池优化
     *
     * Request ignore battery optimizations
     *
     */
    @RequiresApi(api = Build.VERSION_CODES.M)
    fun Activity.requestIgnoreBatteryOptimizations() {
        if (isIgnoringBatteryOptimizations()) return
        try {
            val intent = Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS)
            intent.data = Uri.parse("package:" + applicationContext.packageName)
            startActivity(intent)
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }

    /**
     *
     * 判断是否开启电池优化
     * Is ignoring battery optimizations
     *
     * @return
     */
    @RequiresApi(api = Build.VERSION_CODES.M)
    fun Context.isIgnoringBatteryOptimizations(): Boolean {
        var isIgnoring = false
        val powerManager = getSystemService(Context.POWER_SERVICE) as PowerManager?
        if (powerManager != null) {
            isIgnoring = powerManager.isIgnoringBatteryOptimizations(applicationContext.packageName)
        }
        return isIgnoring
    }

    /**
     *
     * 在多任务列表页面隐藏App窗口
     *
     * Hide app window
     *
     * @param isHide
     */
    fun Context.hideAppWindow(isHide: Boolean = true) {
        try {
            val activityManager: ActivityManager =
                getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
            //控制App的窗口是否在多任务列表显示
            activityManager.appTasks[0].setExcludeFromRecents(isHide)
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }


    fun Context.findActivity(): Activity {
        var context = this
        while (context is ContextWrapper) {
            if (context is Activity) return context
            context = context.baseContext
        }
        throw IllegalStateException("Permissions should be called in the context of an Activity")
    }
}